<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html lang="zh-CN"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta http-equiv="Content-Language" content="zh-CN"><link href="stylesheet.css" media="all" rel="stylesheet" type="text/css">
<title>数据改变的可视性</title>
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head><body class="SECT1">
<div>
<table summary="Header navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><th colspan="5" align="center" valign="bottom">PostgreSQL 8.2.3 中文文档</th></tr>
<tr><td width="10%" align="left" valign="top"><a href="trigger-definition.html" accesskey="P">后退</a></td><td width="10%" align="left" valign="top"><a href="triggers.html">快退</a></td><td width="60%" align="center" valign="bottom">章34. 触发器</td><td width="10%" align="right" valign="top"><a href="triggers.html">快进</a></td><td width="10%" align="right" valign="top"><a href="trigger-interface.html" accesskey="N">前进</a></td></tr>
</table>
<hr align="LEFT" width="100%"></div>
<div class="SECT1"><h1 class="SECT1"><a name="TRIGGER-DATACHANGES">34.2. 数据改变的可视性</a></h1>
<p>如果在触发器函数里执行 SQL 命令，并且这些命令访问触发器所在的表，那么你必须知道触发器的可视性规则，因为这些规则决定这些 SQL 命令是否能看到触发触发器的数据改变。简单说：</p>
<ul>
<li><p>语句级别的触发器遵循简单的可视性原则：在语句之前(before)触发的触发器看不到语句所做的修改，而所有修改都可以被语句之后(after)触发的触发器看到。</p></li>
<li><p>导致触发器触发的数据改变(插入、更新、删除)通常是<span class="emphasis"><i class="EMPHASIS">不能</i></span>被一个 before 触发器里面执行的 SQL 命令看到的，因为它还没有发生。</p></li>
<li><p>不过，在 before 触发器里执行的 SQL 命令将<span class="emphasis"><i class="EMPHASIS">能够</i></span>看到在同一个外层命令前面处理的行的改变。这一点需要仔细，因为这些改变的顺序通常是不可预期的；一个影响多行的 SQL 命令可能以任意顺序访问这些行。</p></li>
<li><p>在一个 after 触发器被触发的时候，所有外层命令产生的数据改变都已经完成，可以被所执行的 SQL 命令看到。</p></li>
</ul>
<p>有关数据可视性规则的更多信息可以在<a href="spi-visibility.html">节41.4</a>找到。<a href="trigger-example.html">节34.4</a>里的例子包含这些规则的演示。</p>
</div>
<div>
<hr align="LEFT" width="100%">
<table summary="Footer navigation table" width="100%" border="0" cellpadding="0" cellspacing="0">
<tr><td width="33%" align="left" valign="top"><a href="trigger-definition.html" accesskey="P">后退</a></td><td width="34%" align="center" valign="top"><a href="index.html" accesskey="H">首页</a></td><td width="33%" align="right" valign="top"><a href="trigger-interface.html" accesskey="N">前进</a></td></tr>
<tr><td width="33%" align="left" valign="top">触发器行为概述</td><td width="34%" align="center" valign="top"><a href="triggers.html" accesskey="U">上一级</a></td><td width="33%" align="right" valign="top">用 C 写触发器</td></tr>
</table>
</div>
</body></html>